#ifndef TABLE_H
#define TABLE_H
// 一个表格最多有几页
#define TABLE_MAX_PAGES 100
// #define size_of_attribute(Struct, Attribute) sizeof(((Struct*)0)->Attribute)
#include <stdint.h>
extern const uint32_t ID_SIZE /*= size_of_attribute(Row, id)*/;
extern const uint32_t USERNAME_SIZE /*= size_of_attribute(Row, username)*/;
extern const uint32_t EMAIL_SIZE /*= size_of_attribute(Row, email)*/;
extern const uint32_t ID_OFFSET /*= 0*/;
extern const uint32_t USERNAME_OFFSET /*= ID_OFFSET + ID_SIZE*/;
extern const uint32_t EMAIL_OFFSET /*= USERNAME_OFFSET + USERNAME_SIZE*/;
extern const uint32_t ROW_SIZE /*= ID_SIZE + USERNAME_SIZE + EMAIL_SIZE*/;
/*这意味着序列化行的布局看起来像这样:
column	  size (bytes)	offset
id	      4	            0
username	32	          4
email	    255	          36
total	    291
*/

extern const uint32_t PAGE_SIZE /*= 4096*/;
extern const uint32_t ROWS_PER_PAGE /*= PAGE_SIZE / ROW_SIZE*/;
extern const uint32_t TABLE_MAX_ROWS /*= ROWS_PER_PAGE * TABLE_MAX_PAGES*/;
typedef enum { EXECUTE_SUCCESS, EXECUTE_TABLE_FULL } ExecuteResult;

#define COLUMN_USERNAME_SIZE 32
#define COLUMN_EMAIL_SIZE 255

//数据库中的一行。
typedef struct {
  uint32_t id;
  char username[COLUMN_USERNAME_SIZE+1];
  char email[COLUMN_EMAIL_SIZE+1];
} Row;
void print_row(Row* row);

//一个页。
typedef struct {
  int file_descriptor;//文件描述符
  uint32_t file_length;//文件长度
  void* pages[TABLE_MAX_PAGES];
} Pager;
//这是一个结构体，代表一个表。
typedef struct {
  uint32_t num_rows;
  //void* pages[TABLE_MAX_PAGES];
  Pager* pager;
} Table;

//打开一个文件，并返回一个页。
Pager* pager_open(const char* filename);
void* get_page(Pager* pager, uint32_t page_num);
void pager_flush(Pager* pager, uint32_t page_num, uint32_t size);

void db_close(Table* table);
//打开数据库。
Table* db_open(const char* filename);

//利用得到row_num得到row的位置
void* row_slot(Table* table, uint32_t row_num);
//这个函数用于序列化一行。
void serialize_row(Row* source, void* destination);
//这个函数用于反序列化一行。
void deserialize_row(void* source, Row* destination);

#endif